/**
在 TypeScript 中，非空类型断言（Non-null Assertion）是一种语法，用于告诉编译器某个值在使用时不会为  `null`  或  `undefined` 。这在处理可能为  `null`  或  `undefined`  的值时特别有用。
  1. 非空类型断言的语法

  非空类型断言使用  `!`  运算符，放在表达式的末尾。例如：
  let someValue: string | null = null;

  // 使用非空类型断言
  let strLength: number = someValue!.length; // 编译器不会报错
  在这个例子中， `someValue!`  表示我们确信  `someValue`  不会是  `null`  或  `undefined` 。

  2. 使用场景

  - 处理可能为  `null`  的值：当你知道某个值在特定情况下不会为  `null`  或  `undefined`  时，可以使用非空类型断言来避免编译错误。

  - 与 DOM 交互：在访问 DOM 元素时，如果你确定某个元素存在，可以使用非空类型断言。例如：
  const inputElement = document.getElementById("myInput") as HTMLInputElement | null;
  const value = inputElement!.value; // 确保 inputElement 不为 null
  3. 注意事项

  - 谨慎使用：非空类型断言会绕过 TypeScript 的类型检查，因此使用时要确保你对值的状态有充分的了解。错误的使用可能导致运行时错误。

  - 避免滥用：尽量避免在不确定值的情况下使用非空类型断言。可以通过条件判断、类型保护等方式来确保值的安全性。

  - 与可选链结合使用：在处理复杂对象时，可以结合可选链（ `?.` ）和非空类型断言来提高代码的安全性和可读性。

  4. 结论

  非空类型断言是 TypeScript 提供的一种强大工具，可以帮助开发者在特定情况下绕过类型检查。然而，使用时要非常谨慎，以避免潜在的运行时错误。推荐在确保值确实存在的情况下使用，保持代码的安全性和可维护性。
 */
interface IPerson {
  name: string;
  age: number;
  friend?: {
    name: string;
    age: number;
  };
}

const notNullAssertion: IPerson = {
  name: "Non-null Assertion",
  age: 18,
}

// 访问属性: 可选链: ?.
console.log(notNullAssertion.friend?.name)

// 属性赋值:
// 解决方案一: 类型缩小
if (notNullAssertion.friend) {
  notNullAssertion.friend.name = "kobe"
}

// 解决方案二: 非空类型断言(有点危险, 只有确保friend一定有值的情况, 才能使用)
// notNullAssertion.friend!.name = "james"

export {}
